import {
  DataCategoryEnum,
  DataSourceEnum,
  FuelTypeEnum,
  NodeTypeEnum,
  ProcessStageCodeEnum,
  TransportMethodEnum,
  TransportRatioMap,
  FlowTypeEnum,
  RelateStatusEnum,
  FlowNodeTypeEnum,
  AccountTypeEnum
} from '@/constants/pcf';

/**
 * 总览各个阶段 item
 */
export interface StageListItem {
  /**
   * 生命周期
   */
  lifeCycleStage: keyof typeof ProcessStageCodeEnum;
  /**
   * 生命周期数据
   */
  stageDataList: {
    /**
     * 数据类型
     */
    dataType: string;
    /**
     * 数量
     */
    dataNum: number;
  }[];
}

/**
 * 查询模型产品BOM清单 返回值
 */
export interface GetListBomTreeResult extends BaseNode {
  /**
   * 父级元素 nodeNo
   */
  parentNodeNo: string;
  dataSource: keyof typeof DataSourceEnum;
  supplierNo: string;
  supplierCode: string;
  remark: string;
  hasChildren: boolean;
  quotationNo: string;
  isLeaf: boolean;
  filtered?: boolean; // 是否为过滤后的字段
  children: GetListBomTreeResult[] | [];
  modelNo?: string;
}

/**
 * 获取BOM节点详情 返回数据
 */
export interface GetNodeDetailResult extends BaseNode {
  /**
   * 材料使用系数
   */
  useRate: number;
  /**
   * 材料循环比例
   */
  recycleRate: number;
  /**
   * 偏差范围
   */
  deviationRange: number;
  /**
   * 数据来源
   */
  dataSource: keyof typeof DataSourceEnum;
  supplierNo: string;
  supplierName: string;
  supplierCode: string;
}

/**
 * Node节点基础类型
 */
export interface BaseNode {
  /**
   * 节点编号
   */
  nodeNo: string;
  /**
   * 	物料名称
   */
  nodeName: string;
  /**
   * 物料编码
   */
  nodeCode: string;
  /**
   * 物料类型
   */
  dataType: keyof typeof NodeTypeEnum;
  /**
   * 材料分类/牌号
   */
  materialCategory: string;
  /**
   * 用量
   */
  dosage: string;
  /**
   * 用量单位
   */
  unit: string;
  /**
   * 单位重量
   */
  weight?: string;
  /**
   * 单位重量单位
   */
  weightUnit?: string;
  /**
   * 供应商编号
   */
  supplierNo: string;
  /**
   * 供应商名称
   */
  supplierName: string;
  /**
   * 数据备注
   */
  remark: string;
  quantity: number;
}

/**
 * 查看节点场地数据 返回参数
 */

export interface IManufactureItem {
  /**
   * 场地数据类型
   */
  dataType: string;
  nodeName: string;
  dosage: string;
  unit: string;
  /**
   * 	利用率
   */
  useRate: string;
  /**
   * 备注说明
   */
  remark: string;
}
export interface ISupplierFactorResult {
  supplierName: string;
  factor: string;
  factorUnit: string;
  certificationOrg: string;
  attachmentName: string;
  attachmentUrl: string;
}
export interface GetBomProductionDataResult {
  dataSource: keyof typeof DataSourceEnum;
  manufactureDataList: IManufactureItem[];
  supplierFactor: ISupplierFactorResult;
}

/**
 * 分页查询零部件模型 入参
 */
export interface GetPageItemModelParams {
  /**
   * 零部件编码
   */
  productCode: string;
  /**
   * 零部件名称
   */
  productName: string;
  /**
   * 排除的模型编号
   */
  excludeModelNo: string;
}

export interface GetPageItemFormParams {
  /**
   * 零部件编码
   */
  productCode?: string;
  /**
   * 零部件名称
   */
  productName?: string;
  /**
   * 供应商编号
   */
  supplierNo: string;
}

/**
 * 分页查询零部件模型 返回参数
 */
export interface GetPageItemModelResult {
  /**
   * 零部件编码
   */
  modelCode: string;
  /**
   * 模型编号
   */
  modelNo: string;
  /**
   * 零部件名称
   */
  modelName: string;
  /**
   * 数据年份
   */
  accountYear: string;
  /**
   * 提交人
   */
  submitBy: string;
  /**
   * 提交时间
   */
  submitTime: string;
}

/**
 * 新增物料 入参
 */
export type AddNodeParams = Omit<GetNodeDetailResult, 'nodeNo, dataSource'>;

/**
 * 编辑物料 入参
 */
export type EditNodeParams = Omit<GetNodeDetailResult, 'dataSource'>;

/**
 * 物料 基本入参
 */
export interface BaseNodeParams {
  /**
   * 物料名称
   */
  nodeName: string;
  /**
   * 物料名称
   */
  nodeCode: string;
  /**
   * 物料类型；MATERIAL-材料；ITEM-零部件
   */
  dataType: string;
  /**
   * 材料类别或者牌号
   */
  materialCategory: string;
  /**
   * 用量
   */
  dosage: number;
  /**
   * 用量单位
   */
  unit: string;
  /**
   * 单位重量
   */
  weight: number;
  /**
   * 单位重量的单位
   */
  weightUnit: string;
  /**
   * 物料利用率
   */
  useRate: number;
  /**
   * 偏差范围
   */
  deviationRange: string;
  /**
   * 供应商编码
   */
  supplierNo: string;
  /**
   * 供应商名称
   */
  supplierName: string;
  /**
   * 备注(加工工艺、规格型号)
   */
  remark: string;
}

/**
 * 查询生产过程/使用场景/处置情景信息 入参
 */
export interface GetListProcessInfoParams {
  /**
   * 模型编号
   */
  modelNo: string;
  /**
   * 生命周期阶段: 生产阶段、产品使用阶段、报废处置阶段
   */
  lifeCycleStage: string;
}

/**
 * 查询生产过程/使用场景/处置情景信息 返回值
 */
export interface GetListProcessInfoResult {
  /**
   * 产出物数量
   */
  productNum: number;
  /**
   * 产出物单位
   */
  productUnit: string;
  /**
   * 工序列表
   */
  processList: ProcessListItem[];
}

/**
 * 查询生产过程/使用场景/处置情景信息 工序列表 item
 */
export interface ProcessListItem {
  /**
   * 工序编号/情景编号
   */
  processNo: string;
  /**
   * 工序名称/情景名称
   */
  processName: string;
  /**
   * 流/物流线路信息
   */
  processDataList: ProcessDataItem[];
}

/**
 * 流/物流线路信息 item
 */
export interface ProcessDataItem {
  /**
   * 数量
   */
  quantity: string;
  quotationNo: string;
  partNodeNo?: string;
  dataSource: string;
  /**
   * 流编号
   */
  nodeNo: string;
  /**
   * 流名称
   */
  nodeName: string;
  /**
   * 流类型
   */
  dataType: string;
  /**
   * 用量
   */
  dosage: string;
  /**
   * 用量单位
   */
  unit: string;
  /**
   * 备注
   */
  remark: string;
  /**
   * 运输物名称：主产物
   */
  transferNodeName: string;
  /**
   * 运输物节点编号：主产物时候非必填
   */
  transferNodeNo?: string;
  /**
   * 运输方式
   */
  transferMethod: keyof typeof TransportMethodEnum;
  /**
   * 燃料类型
   */
  fuelType: keyof typeof FuelTypeEnum;
  /**
   * 运载率
   */
  transferRate: keyof typeof TransportRatioMap;
  /**
   * 利用率/运载率
   */
  useRate: string;
  /**
   * 燃料类型
   */
  materialCategory: keyof typeof FuelTypeEnum;
  /**
   * 运输距离
   */
  distance: string;
  /**
   * 运输距离单位
   */
  distanceUnit: string;
  /**
   * 货物重量
   */
  weight: string;
  /**
   * 货物重量单位
   */
  weightUnit: string;
  supplierFormAttachmentCount: number;
}

/**
 * 更新产出物数量和单位 入参
 */
export interface PostUpdateProductParams {
  modelNo: string;
  /**
   * 生命周期阶段
   */
  lifeCycleStage: string;
  /**
   * 产出物数量
   */
  productNum: number;
}

/**
 * 新增工序/情景 入参
 */
export interface AddProcessParams {
  /**
   * 模型编号
   */
  modelNo: string;
  /**
   * 生命周期阶段
   */
  lifeCycleStage: string;
  /**
   * 情景名称/工序名称
   */
  processName: string;
}

/**
 * 编辑工序/情景 入参
 */
export interface EditProcessParams {
  /**
   * 工序编号/情景编号
   */
  processNo: string;
  /**
   * 情景名称/工序名称
   */
  processName: string;
}

/**
 * 查询生产过程/物流运输/使用场景/处置情景信息节点信息 返回参数
 */
export interface GetNodeInfoResult extends BaseNode {
  quotationNo: string;
  nodeType: 'BOM' | 'FLOW' | 'TRANSFER';
  nodeCode: string;
  dataType: any;
  useRate: number;
  /**
   * 运输物类别：MAIN - 主产物，ITEM - 零部件，MATERIAL - 材料
   */
  transferCategory: keyof typeof DataCategoryEnum;
  /**
   * 运输物名称：主产物
   */
  transferNodeName: string;
  /**
   * 运输物节点编号：主产物时候非必填
   */
  transferNodeNo?: string;
  /**
   * 运输方式
   */
  transferMethod: keyof typeof TransportMethodEnum;
  /**
   * 燃料类型
   */
  fuelType: keyof typeof FuelTypeEnum;
  /**
   * 运载率
   */
  transferRate: keyof typeof TransportRatioMap;
  /**
   * 运输距离
   */
  distance: string;
  /**
   * 运输距离 单位
   */
  distanceUnit: string;
  partNodeNo: string;
}

/**
 * 新增流 入参
 */
export interface AddStageFlowParams extends BaseFlowParams {
  /**
   * 情景编号/工序编号
   */
  processNo: string;
  /**
   * 部件更换节点编号
   */
  partNodeNo?: string;
}

/**
 * 编辑流 入参
 */
export interface EditStageFlowParams extends BaseFlowParams {
  /**
   * 流编号
   */
  nodeNo: string;
  /**
   * 部件更换节点编号
   */
  partNodeNo?: string;
}

/**
 * 基础新增/编辑流 入参
 */
export interface BaseFlowParams {
  /**
   * 流类型
   */
  dataType: string;
  // /**
  //  * 对应产出当前节点产品的数量
  //  */
  // productNum: string;
  // /**
  //  * 对应产出当前节点产品的单位
  //  */
  // productUnit: string;
  /**
   * 流名称
   */
  nodeName: string;
  /**
   * 用量
   */
  dosage: string;
  /**
   * 用量单位
   */
  unit: string;
  /**
   * 备注
   */
  remark: string;
}

/**
 * 新增运输路线 入参
 */
export interface AddTransportStageFlowParams extends BaseTransportStageFlowParams {
  /**
   * 情景编号
   */
  processNo: string;
}

/**
 * 编辑运输路线 入参
 */
export interface EditTransportStageFlowParams extends BaseTransportStageFlowParams {
  /**
   * 运输线路编号
   */
  nodeNo: string;
}

/**
 * 基础新增/编辑运输路线 入参
 */
export interface BaseTransportStageFlowParams {
  /**
   * 运输物类别：MAIN - 主产物，ITEM - 零部件，MATERIAL - 材料
   */
  transferCategory: keyof typeof DataCategoryEnum;
  /**
   * 运输物名称：主产物
   */
  transferNodeName: string;
  /**
   * 运输物节点编号：主产物时候非必填
   */
  transferNodeNo?: string;
  /**
   * 运输方式
   */
  transferMethod: keyof typeof TransportMethodEnum;
  /**
   * 燃料类型
   */
  fuelType: keyof typeof FuelTypeEnum;
  /**
   * 运载率
   */
  transferRate: keyof typeof TransportRatioMap;
  /**
   * 运输距离
   */
  distance: string;
  /**
   * 运输距离单位
   */
  distanceUnit: string;
  /**
   * 货物重量
   */
  weight: string;
  /**
   * 货物重量单位
   */
  weightUnit: string;
  /**
   * 备注
   */
  remark?: string;
}

export interface RelationFactorListResult {
  // 因子id
  id: string;
  // 因子名称(CN)
  factorName: string;
  // 因子名称(EN)
  enName: string;
  // 类别枚举
  category: string;
  // 类别中文名
  categoryName: string;
  // 排放因子
  emissionFactor: string;
  // 因子单位
  factorUnit: string;
  // 国别
  country: string;
  // 数据采集周期
  baseYear: string;
  // 因子来源
  factorSource: string;
  // 发布时间
  releaseTime: string;
}

export interface IFactorListParams {
  current?: string | number;
  size?: string | number;
  factorNameOrNo?: string;
  category?: string;
  country?: string;
  factorSource?: string;
  tag?: string;
}

export interface IFlowParams {
  modelNo: string;
  dataType?: keyof typeof FlowTypeEnum; // 流类型
  lifeCycleStage?: keyof typeof ProcessStageCodeEnum; //
  nodeName?: string;
  relateStatus?: keyof typeof RelateStatusEnum;
}

export interface IFlowListItem {
  nodeNo: string;
  dataType: keyof typeof FlowTypeEnum; // 流类型
  lifeCycleStage: string; //
  nodeName: string;
  nodePath: string;
  keyProperty: string;
  dosage: string;
  unit: string;
  factor: string;
  factorUnit: string;
  factorNo: string;
  relateStatus: keyof typeof RelateStatusEnum;
  nodeType: keyof typeof FlowNodeTypeEnum;
}

export interface IFactorInfo {
  factorNo: string;
  factorName: string;
  enName: string;
  category: string;
  technology: string;
  emissionFactor: string;
  factorUnit: string;
  country: string;
  baseYear: string;
  boundary: string;
  factorSource: string;
  releaseTime: string;
  version: string;
  comment: string;
  tag: string;
}

export interface IValidListItem {
  ruleNo: string;
  ruleName: string;
  ruleDesc: string;
  ruleValidStatus: string;
  remark: string;
}

export interface IStageListItem {
  stage: string;
  accountResult: number;
  accountRatio: number;
}

export interface ICalcResult {
  modelNo: string;
  accountStatus: keyof typeof AccountTypeEnum;
  accountTime: string;
  accountResult: number;
  unitResult: number;
  accountUnit: string;
  /**
   * BOM累加重量
   */
  productTotalDosage: number;
  referenceFlowUnit: string;
  accountChangeFlag: boolean; // 模型是否有更新
  validList: IValidListItem[];
  stageList: IStageListItem[];
  /**
   * cgcap 分数
   */
  score: number;
  /**
   * 车辆类型 对vehicleType的部分的映射
   * GASOLINE 传统油车
   * ELECTRIC 纯电车
   */
  carType: null | 'GASOLINE' | 'ELECTRIC';
  dqr: number;
  /**
   * 不确定度
   */
  uncertainty: number;
}

export interface INodeTree {
  nodeNo: string;
  nodeName: string;
  children: INodeTree[] | null;
}

export interface IProgress {
  pullStatus: string;
  pullProgress: number;
  modelNo: string;
}

export interface IMaterial {
  inventoryFacilities: string;
  materialNo: number;
  materialName: string;
}

export interface IFillTaskParams {
  orgCode: string;
  inventoryYear: string;
  inventoryFacilities?: string;
  facilityLocation?: string;
}

export interface IFillTaskDetailListItem {
  orgCode: string;
  inventoryYear: string;
  inventoryFacilities: string;
}

export interface IRootQueryParams {
  modelNo: string;
  nameOrCode: string;
  materialCategory: string;
}
